package br.ufg.apkandroidufg.dados.dao;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import br.ufg.apkandroidufg.dados.DatabaseHelper;
import br.ufg.apkwsentidades.Aluno;
import br.ufg.apkwsentidades.Pessoa;
import br.ufg.apkwsentidades.Professor;

public class PessoaDAO {

	private static PessoaDAO instance;
	private SQLiteDatabase database;
	private String QUERY_PESSOA_POR_USUARIO_ID = " SELECT " + " CASE "
			+ " WHEN a.id IS NOT NULL THEN 'aluno' "
			+ " WHEN pro.id IS NOT NULL THEN 'professor' "
			+ " ELSE null END AS tipo, " + " p.nome, " + " p.email "
			+ " FROM pessoa p " + " LEFT JOIN aluno a ON a.id = p.id "
			+ " LEFT JOIN professor pro ON pro.id = p.id "
			+ " WHERE p.usuario = ? ";

	public static PessoaDAO getInstance(Context context) {
		if (instance == null) {
			instance = new PessoaDAO(context);
		}
		return instance;
	}

	private PessoaDAO(Context context) {
		DatabaseHelper helper = new DatabaseHelper(context);
		database = helper.getWritableDatabase();
	}

	public Pessoa buscarPorUsuarioID(Integer id) {
		Cursor result = database.rawQuery(QUERY_PESSOA_POR_USUARIO_ID,
				new String[] { String.valueOf(id) });

		Pessoa pessoa = null;

		if (result.moveToNext()) {
			String tipo = result.getString(0);
			if (TipoPessoa.getTipoPessoa(tipo).equals(TipoPessoa.ALUNO)) {
				pessoa = new Aluno();
			} else if (TipoPessoa.getTipoPessoa(tipo).equals(TipoPessoa.PROFESSOR)) {
				pessoa = new Professor();
			}
			String nome = result.getString(1);
			String email = result.getString(2);

			pessoa.setNome(nome);
			pessoa.setEmail(email);
			pessoa.setId(id);
		}

		result.close();

		return pessoa;
	}

	private enum TipoPessoa {
		ALUNO("aluno"), PROFESSOR("professor");
		private String tipo;

		private TipoPessoa(String tipo) {
			this.tipo = tipo;
		}

		public String getTipo() {
			return tipo;
		}

		public static TipoPessoa getTipoPessoa(String s) {
			if (s.equals(ALUNO.getTipo())) {
				return ALUNO;
			} else if (s.equals(PROFESSOR.getTipo())) {
				return PROFESSOR;
			} else {
				return null;
			}
		}
	}
}
